package org.waddy.framework.pub.util;

import java.text.*;
import java.util.*;
import java.util.Map.Entry;
import java.util.regex.*;
import org.apache.log4j.*;

/**
 * 日期格式化组件
 * @Title DateFormat.java
 * @version 1.0
 * @author zhangdapeng
 * @Created 2014-3-14
 * Copyright (c) 2014 PanGene InfoAnalytics.
 *
 * @Description: 暂只考虑中文日期的提取
 */
public class DateFormat {

    private static Logger logger = Logger.getLogger(DateFormat.class);

    //第1个表示取时间的正则表达式，第2个表示格式化日期的模式
    private Map<String,String> datePatternMap = null;
    
    /**
     * 默认构造器<br>
     * 初始化默认日期匹配模式集合<br>
     */
    public DateFormat() {
    	/**
    	 * 复杂的模式尽量放前面：比如"Thursday September 15, 2011, 3:57 am"里面的"2011, 3:57"会和中文的年月日匹配上
    	 * 在满足该条件的情况下，可以把使用率较高的放前面
    	 */
    	datePatternMap = new LinkedHashMap<String, String>();
    	datePatternMap.put("\\d{2}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}","yy MM dd HH mm ss");
    	datePatternMap.put("\\d{4}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}\\D\\d{1,2}", "yyyy MM dd HH mm");
    	datePatternMap.put("\\d{4}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}", "yyyy MM dd HH");
    	datePatternMap.put("\\d{4}\\D{1,2}\\d{1,2}\\D{1,2}\\d{1,2}", "yyyy MM dd");
    	datePatternMap.put("\\d{2}年\\d{1,2}月\\d{1,2}日", "yyyy MM dd");
	}
    
    public DateFormat (Map<String,String> patternMap) {
    	this.datePatternMap = patternMap;
    }
    
    /**
     * 增加一组日期模板与日期格式映射
     * @param datePattern 日期模板 
     * @param dateFormat 日期格式 
     */
    public void addPatternMap (Map<String,String> patternMap) {
    	this.datePatternMap.putAll(datePatternMap);
    }
    
    /**
     * 增加一个日期模板与日期格式映射
     * @param datePattern 日期模板 
     * @param dateFormat 日期格式 
     */
    public void addPattern (String datePattern, String dateFormat) {
    	this.datePatternMap.put(datePattern, dateFormat);
    }

    /**
     * 寻找字符串中的日期，至少得包含年月日,返回格式yyyy-MM-dd HH:mm
     * @param timeString　
     * @return
     */
    public Date getDate(String dateText) {
    	Date date = null;
        for (Entry<String, String> entry : datePatternMap.entrySet()) {
        	//日期格式匹配
        	String datePattern = entry.getKey();
            Pattern p = Pattern.compile(datePattern);
            Matcher m = p.matcher(dateText);
            if (m.find()) {
            	String dateValue = m.group(0);
                //日期字面值反向解析
                try {
                	String dateFormat = entry.getValue();
                	dateValue = dateValue.replaceAll("\\W+", " ");
                    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.CHINA);
                    sdf.setLenient(false);
                    date = sdf.parse(dateValue);
                } catch (Exception e) {
                    logger.error(dateValue + "日期格式化异常：" + e.getMessage());
                }
                break;
            }
        }
        return date;
    }
    
//    /**
//     * 根据语言获取Locale
//     * @param lang 
//     * @return
//     * @throws Exception 
//     */
//    private static Locale getLocale(String lang) throws Exception {
//        Map<String, Locale> LOCALE_CACHE = new HashMap<String, Locale>();
//        Locale LOCALE = Locale.getDefault();
//        Locale loc = LOCALE_CACHE.get(lang);
//        if (loc == null) {
//            loc = (Locale) Locale.class.getDeclaredField(lang).get(LOCALE);
//            LOCALE_CACHE.put(lang, loc);
//        }
//        return loc;
//    }

}
